#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
节假日出差分析脚本

此脚本用于分析差旅报销中发生在节假日期间的出差情况，并根据目的地城市进行分级分析。
主要功能：
1. 读取差旅报销行程明细数据
2. 判断出发时间是否为节假日
3. 根据优先级城市表对目的地进行分级（一级、二级、三级）
4. 输出分析结果
"""

import pandas as pd
from pathlib import Path
from datetime import datetime

# 配置常量
DATA_DIR = Path("data")
OUTPUT_DIR = DATA_DIR / "alldata"  # 输出目录
TRAVEL_FILE = DATA_DIR / "差旅报销行程明细(商旅).xlsx"
HOLIDAY_FILE = DATA_DIR / "节假日信息.xlsx"
CITY_PRIORITY_FILE = DATA_DIR / "优先级城市.xlsx"
OUTPUT_FILE = OUTPUT_DIR / "节假日出差分析结果.xlsx"

def load_and_process_data():
    """
    加载并处理数据
    
    Returns:
        tuple: (差旅数据DataFrame, 节假日数据DataFrame, 城市优先级数据DataFrame)
    """
    # 确保输出目录存在
    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    
    # 读取数据
    travel_data = pd.read_excel(TRAVEL_FILE)
    holiday_data = pd.read_excel(HOLIDAY_FILE)
    city_priority_data = pd.read_excel(CITY_PRIORITY_FILE)
    
    # 转换日期格式
    travel_data['出发时间'] = pd.to_datetime(travel_data['出发时间']).dt.normalize()  # 只保留年月日
    holiday_data['日期'] = pd.to_datetime(holiday_data['日期']).dt.normalize()  # 只保留年月日
    
    return travel_data, holiday_data, city_priority_data

def classify_city_priority(destination, city_priority_data):
    """
    根据目的地确定城市优先级
    
    Args:
        destination: 目的地名称
        city_priority_data: 城市优先级数据DataFrame
        
    Returns:
        str: 城市优先级（一级/二级/三级）
    """
    # 处理目的地名称，去除可能的后缀（如"市"）并确保是字符串类型
    if pd.isna(destination):
        return '三级'
    
    destination = str(destination).replace('市', '').strip()
    
    # 获取一级和二级城市列表，转换为集合以提高查找效率
    first_tier_cities = set(city_priority_data['一级城市'].dropna().str.replace('市', '').str.strip())
    second_tier_cities = set(city_priority_data['二级城市'].dropna().str.replace('市', '').str.strip())
    
    # 添加调试信息
    print(f"正在匹配城市: {destination}")
    print(f"一级城市列表: {first_tier_cities}")
    print(f"二级城市列表: {second_tier_cities}")
    
    # 检查城市优先级
    if destination in first_tier_cities:
        return '一级'
    elif destination in second_tier_cities:
        return '二级'
    else:
        return '三级'

def filter_and_analyze_data(travel_data, holiday_data, city_priority_data):
    """
    筛选节假日出差数据并进行分析
    
    Args:
        travel_data: 差旅数据DataFrame
        holiday_data: 节假日数据DataFrame
        city_priority_data: 城市优先级数据DataFrame
        
    Returns:
        DataFrame: 分析结果数据
    """
    # 获取节假日日期集合
    holidays = set(holiday_data[holiday_data['类型'] == '节假日']['日期'])
    
    # 筛选出发时间在节假日的记录
    filtered_data = travel_data[travel_data['出发时间'].isin(holidays)].copy()
    
    if filtered_data.empty:
        print("没有找到节假日期间的出差记录")
        return pd.DataFrame()
    
    # 添加目的地城市优先级
    filtered_data['城市优先级'] = filtered_data['目的地名称'].apply(
        lambda x: classify_city_priority(x, city_priority_data)
    )
    
    # 格式化日期
    filtered_data['出发时间'] = filtered_data['出发时间'].dt.strftime('%Y-%m-%d')
    
    return filtered_data

def main(once = False):
    """主程序入口"""
    try:
        print("开始加载数据...")
        travel_data, holiday_data, city_priority_data = load_and_process_data()
        
        print("正在分析数据...")
        result_data = filter_and_analyze_data(travel_data, holiday_data, city_priority_data)
        
        if result_data.empty:
            print("没有找到符合条件的数据")
            return False
        
        # 保存结果
        result_data.to_excel(OUTPUT_FILE, index=False)
        if once:
            return result_data
        print(f"\n分析完成，结果已保存至: {OUTPUT_FILE}")
        print(f"筛选出的记录数: {len(result_data)}")
        
        # 统计分析
        print("\n数据统计:")
        priority_stats = result_data['城市优先级'].value_counts()
        for priority, count in priority_stats.items():
            print(f"{priority}城市出差记录数: {count}")
        
        return True
        
    except Exception as e:
        print(f"处理过程中出现错误: {str(e)}")
        raise

if __name__ == "__main__":
    main() 